package br.com.fox.iebav.session;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.enterprise.context.SessionScoped;
import javax.faces.application.FacesMessage;
import javax.faces.model.SelectItem;
import javax.inject.Named;

import br.com.fox.iebav.controller.command.SalvarEmpresa;
import br.com.fox.iebav.controller.command.SalvarUsuario;
import br.com.fox.iebav.dao.CidadesDAO;
import br.com.fox.iebav.dao.EstadosDAO;
import br.com.fox.iebav.dao.RamosAtividadeDAO;
import br.com.fox.iebav.dao.TiposLogradouroDAO;
import br.com.fox.iebav.entity.Cidades;
import br.com.fox.iebav.entity.Empresas;
import br.com.fox.iebav.entity.Estados;
import br.com.fox.iebav.entity.Ramosatividade;
import br.com.fox.iebav.entity.Responsavelempresa;
import br.com.fox.iebav.entity.Tiposlogradouro;
import br.com.fox.iebav.session.abstractsession.AbstractSession;

@Named("empresaBeanSession")
@SessionScoped
public class EmpresaBeanSession extends AbstractSession implements Serializable {
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
//	ATRIBUTOS
	private List<Empresas> empresasList;
	private Empresas empresaSelecionada;
	private List<SelectItem> tiposLogradouroList, ramosAtividadeList, estadosList, cidadesList;
	private Estados estadoSelecionado;
	private Integer indiceTab; 

//	EJBs
	private @EJB TiposLogradouroDAO tiposLogradourodao;
	private @EJB RamosAtividadeDAO ramosAtividadedao;
	private @EJB EstadosDAO estadosdao;
	private @EJB CidadesDAO cidadesdao;

//	CONTROLLER COMMAND
	private @EJB SalvarEmpresa salvarEmpresa;
	private Map<String, Object> resultMap;
	
	
	@PostConstruct
	public void init()
	{
		setEmpresaSelecionada(new Empresas());
		getEmpresaSelecionada().setRamo(new Ramosatividade());
		getEmpresaSelecionada().setResponsavel(new Responsavelempresa());
		carregarEmpresas();
		redirecionarURL("empresas.java");
	}		
	
	public void carregarEmpresas()
	{
		setEmpresasList( salvarEmpresa.getEmpresasdao().findAll() );
	}
	
	public void carregarEstados()
	{
		setEstadosList(new ArrayList<SelectItem>());
		List<Estados> list = estadosdao.findAll();
		for(Estados n : list)
			getEstadosList().add( new SelectItem(n,n.getNome()) );
	}
	
	public void carregarCidadesIniciais()
	{
		setCidadesList(new ArrayList<SelectItem>());
		List<Cidades> list = cidadesdao.findByEstado( 1 ); // cidades do acre
		for(Cidades n : list)
			getCidadesList().add( new SelectItem(n,n.getNome()) );
	}
	
	public void carregarCidades()
	{
		setCidadesList(new ArrayList<SelectItem>());
		List<Cidades> list = cidadesdao.findByEstado( getEstadoSelecionado().getId() );
		for(Cidades n : list)
			getCidadesList().add( new SelectItem(n,n.getNome()) );
	}
	
	public void carregarTiposLogradouro()
	{
		setTiposLogradouroList(new ArrayList<SelectItem>());
		List<Tiposlogradouro> list = tiposLogradourodao.findAll();
		for(Tiposlogradouro n : list)
			getTiposLogradouroList().add( new SelectItem(n,n.getNome()) );
	}
	
	public void carregarRamosAtividade()
	{
		setRamosAtividadeList(new ArrayList<SelectItem>());
		List<Ramosatividade> list = ramosAtividadedao.findAll();
		for(Ramosatividade s : list)
			getRamosAtividadeList().add( new SelectItem(s,s.getNome()) );
	}
	
	public void abrirEmpresaSelecionada()
	{
		setIndiceTab(0);
		carregarRamosAtividade();
		carregarTiposLogradouro();
		carregarEstados();
		redirecionarURL("empresaPersistencia.java");
	}
	
	public void novaEmpresa()
	{
		setIndiceTab(0);
		setEmpresaSelecionada(new Empresas());
		getEmpresaSelecionada().setRamo(new Ramosatividade());
		getEmpresaSelecionada().setResponsavel(new Responsavelempresa());
		setEstadoSelecionado(null);
		carregarRamosAtividade();
		carregarTiposLogradouro();
		carregarEstados();
		carregarCidadesIniciais();
		redirecionarURL("empresaPersistencia.java");
	}
	
	public void salvarEmpresa()
	{
		getEmpresaSelecionada().setCargoResponsavel( getEmpresaSelecionada().getResponsavel().getCargo() );
		getEmpresaSelecionada().setCpfResponsavel( getEmpresaSelecionada().getResponsavel().getCpf() );
		getEmpresaSelecionada().setEmailResponsavel( getEmpresaSelecionada().getResponsavel().getEmail() );
		getEmpresaSelecionada().setNomeResponsavel( getEmpresaSelecionada().getResponsavel().getNome() );
		getEmpresaSelecionada().setSenhaResponsavel( getEmpresaSelecionada().getResponsavel().getSenha() );
		
		resultMap = salvarEmpresa.execute( getEmpresaSelecionada() );
		if( ( (Boolean) resultMap.get("resultado") ) )
			facesMensagens(FacesMessage.SEVERITY_INFO,((String)resultMap.get("mensagem")),"");
		else
			facesMensagens(FacesMessage.SEVERITY_ERROR,((String)resultMap.get("mensagem")),"");
		carregarEmpresas();
	}

	public List<Empresas> getEmpresasList() {
		return empresasList;
	}

	public void setEmpresasList(List<Empresas> empresasList) {
		this.empresasList = empresasList;
	}

	public Empresas getEmpresaSelecionada() {
		return empresaSelecionada;
	}

	public void setEmpresaSelecionada(Empresas empresaSelecionada) {
		this.empresaSelecionada = empresaSelecionada;
	}

	public List<SelectItem> getTiposLogradouroList() {
		return tiposLogradouroList;
	}

	public void setTiposLogradouroList(List<SelectItem> tiposLogradouroList) {
		this.tiposLogradouroList = tiposLogradouroList;
	}

	public List<SelectItem> getRamosAtividadeList() {
		return ramosAtividadeList;
	}

	public void setRamosAtividadeList(List<SelectItem> ramosAtividadeList) {
		this.ramosAtividadeList = ramosAtividadeList;
	}

	public Integer getIndiceTab() {
		return indiceTab;
	}

	public void setIndiceTab(Integer indiceTab) {
		this.indiceTab = indiceTab;
	}

	public List<SelectItem> getEstadosList() {
		return estadosList;
	}

	public void setEstadosList(List<SelectItem> estadosList) {
		this.estadosList = estadosList;
	}

	public List<SelectItem> getCidadesList() {
		return cidadesList;
	}

	public void setCidadesList(List<SelectItem> cidadesList) {
		this.cidadesList = cidadesList;
	}

	public Estados getEstadoSelecionado() {
		return estadoSelecionado;
	}

	public void setEstadoSelecionado(Estados estadoSelecionado) {
		this.estadoSelecionado = estadoSelecionado;
	}
}
